package deque;

import com.alibaba.fastjson.JSON;
import concurrent.completableFuture.UserInfo;
import org.junit.Test;

import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;

public class a1_ArrayDeque {

	/**
	 * 构造函数
	 */
	@Test
	public void test1() {
		//array deque 的初始化容量是16
		ArrayDeque<String> deque = new ArrayDeque<>();

		//array deque 的最小容量为8，当传入的值大于等于8时，会调整为最接近8的一个 2的n次方
		ArrayDeque<String> deque1 = new ArrayDeque<>(10);

		//array deque传入集合对象
		Set<Integer> set = new HashSet<>();
		set.add(1);
		set.add(null);
		set.add(2);

		//构造函数以集合为对象，没有使用 System.arraycopy()，而是用for循环将元素一个个放入的deque，
		// 是因为array deque不能有null值
		ArrayDeque<Integer> deque2 = new ArrayDeque<>(set);
		System.out.println(deque2);
	}


	@Test
	/**
	 * 队列
	 * 每种功能都有两个方法，其中
	 * add()，remove()，element()如果操作失败会报异常，
	 * offer()，poll()，peek()操作失败会返回null或者false
	 */
	public void test2() {
		ArrayDeque<String> deque = new ArrayDeque<>();

		//入队：add 与 offer 实际上调用的方法都是 addLast(e)
		deque.add("1");
		deque.offer("2");

		//出队：remove 上有notnull注解，poll没有
		System.out.println(deque.remove());
		System.out.println(deque.poll());

		//获取（不出队）
		System.out.println(deque.element());
		System.out.println(deque.peek());
		System.out.println(JSON.toJSONString(deque));
	}

	/**
	 * 栈
	 */
	@Test
	public void test3() {
		ArrayDeque<String> deque = new ArrayDeque<>();
		//入栈
		deque.push("1");
		//获取并出栈
		System.out.println(deque.pop());
		//获取不出栈
		System.out.println(deque.peek());
	}

	/**
	 * addFirst();
	 * addLast();
	 * 循环队列的核心算法：
	 * tail = (tail + 1) & (elements.length - 1)
	 * head = (head - 1) & (elements.length - 1)
	 */
	@Test
	public void test4() {
		ArrayDeque<Integer> deque = new ArrayDeque<>();
		deque.addLast(1);
		deque.addFirst(2);
	}

}
